Padroneggiare il ciclo di vita di un oggetto C++ significa comandare i meccanismi stessi dell'esistenza all'interno del heap e dello stack. Il controllo di copia definisce come una classe gestisce il suo ciclo di vita attraverso due operazioni: il costruttore di copia e il operatore di assegnazione di copia.
1. Inizializzazione vs. Assegnazione
Inizializzazione diretta (ad esempio, string dots(10, '.')) chiama direttamente un costruttore. Tuttavia, inizializzazione per copia (string s2 = dots) si basa sul costruttore di copia. A differenza dell'inizializzazione, assegnazione (trans = accum) sovrascrive un oggetto esistente usando operatore=. Un vincolo fondamentale: il parametro del costruttore di copia deve essere un riferimento (const Foo&); altrimenti, passare un argomento per valore attiverebbe un ciclo ricorsivo infinito di chiamate di copia.
2. Il Ruolo della Sintesi
Se non definisci questi membri, il compilatore fornisce versioni sintetizzate che eseguono copie membro per membro. Attento: sebbene sufficienti per tipi semplici, spesso falliscono per classi che gestiscono memoria dinamica, causando puntatori appesi o doppie liberazioni.